
"""提供一种可嵌入硬盘的存储方式，可以限制存储在内存的大小"""
from storage.lru_store.lru_cache import LRUCache
from storage.lru_store.sqlite_db import SqliteDB


class PersistentStorage:


    def __init__(self, len, dbname):

        # 用来存储 key,value 数据,  --  维护在内存中,最大长度为len.
        # 保存最新的数据.  默认使用 lru 算法
        self.cache = LRUCache(len)

        # 用来存储超出len的数据，到嵌入式数据库sqlite中，

        # 使用前，清空内容
        with open(dbname, 'w') as file:
            pass  # 文件已清空，无需写入任何内容
        self.db = SqliteDB(dbname)

        # 清空表的数据
        self.db.clear()



    def show_all(self):
        """展示当前存储的所有状态信息"""
        print("cach内容为")
        self.cache.show()
        print("db内容为")
        self.db.show()
        print('--------------------')

    def add(self,key, value):
        """用来添加数据,如果超出长度,则将内存数据存储到数据库中"""

        # 存储数据
        self.cache.add(key, value)

        # 如果超出内存长度,存储到sqlite中
        key,value = self.cache.evict()

        if key:
            assert value is not None
            self.db.add(key,value)

    def set(self,key,value):
        """表示初始设置,第一次设置,数据库中没有"""
        self.add(key,value)

    def update(self,key, value):
        """需要更改某数据的值,需要先从数据库删除(保证cache,db不会出现重复不同的值)"""

        # 确保数据库中无此数据.
        self.db.delete(key)

        self.add(key,value)


    def get(self,key):
        """通过key,查找对应的值
        参数:
            key : 表示需要查找的键
        返回值:
            - value: key对应的值
            - None  值为空

        """

        # 先去缓存找
        value = self.cache.get(key)
        if value is not None:
            return value

        # 从数据库查找
        value = self.db.get(key)
        if value is not None:
            # 将数据添加到缓存中
            self.add(key,value)
            # 从数据库删除
            self.db.delete(key)
            return value
        else:
            return None


    def delete(self, key):
        """删除某元素"""
        self.cache.delete(key)
        self.db.delete(key)




# Example usage:
if __name__ == "__main__":
    store = PersistentStorage(2,r"C:\Users\23274\Desktop\毕业准备\PROCESS-代码测试开发（检测与评估为重点）\darpa-e3-detection\experiment_for_compact\e_compact_1_node_dp")

    uuid = '1111'
    uuid2 = '222'
    data = {'111111111': 'value1'}
    data2 = {'2222222': 'val'}
    store.add(uuid, data)
    store.show_all()

    store.add(uuid2, data2)
    store.db.delete('4F909471-32BE-7C54-BE32-1D05C47CA876')
    store.show_all()

    uuid3 = '333'
    data3 = {'3333333333': ['11212']}
    store.add(uuid3, data3)
    store.show_all()

    store.get('1111')
    store.show_all()